{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 导入工具包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据读取及基本处理\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "# plotting\n",
    "import seaborn as sn\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "# setting params\n",
    "params = {'legend.fontsize': 'x-large',\n",
    "          'figure.figsize': (30, 10),\n",
    "          'axes.labelsize': 'x-large',\n",
    "          'axes.titlesize':'x-large',\n",
    "          'xtick.labelsize':'x-large',\n",
    "          'ytick.labelsize':'x-large'}\n",
    "\n",
    "sn.set_style('whitegrid')\n",
    "sn.set_context('talk')\n",
    "\n",
    "plt.rcParams.update(params)\n",
    "pd.options.display.max_colwidth = 600\n",
    "\n",
    "# pandas display data frames as tables\n",
    "from IPython.display import display, HTML"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 导入数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>dteday</th>\n",
       "      <th>season</th>\n",
       "      <th>yr</th>\n",
       "      <th>mnth</th>\n",
       "      <th>holiday</th>\n",
       "      <th>weekday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>weathersit</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>casual</th>\n",
       "      <th>registered</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>2011-01-01</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.344167</td>\n",
       "      <td>0.363625</td>\n",
       "      <td>0.805833</td>\n",
       "      <td>0.160446</td>\n",
       "      <td>331</td>\n",
       "      <td>654</td>\n",
       "      <td>985</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>2011-01-02</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.363478</td>\n",
       "      <td>0.353739</td>\n",
       "      <td>0.696087</td>\n",
       "      <td>0.248539</td>\n",
       "      <td>131</td>\n",
       "      <td>670</td>\n",
       "      <td>801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>2011-01-03</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.196364</td>\n",
       "      <td>0.189405</td>\n",
       "      <td>0.437273</td>\n",
       "      <td>0.248309</td>\n",
       "      <td>120</td>\n",
       "      <td>1229</td>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>2011-01-04</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.200000</td>\n",
       "      <td>0.212122</td>\n",
       "      <td>0.590435</td>\n",
       "      <td>0.160296</td>\n",
       "      <td>108</td>\n",
       "      <td>1454</td>\n",
       "      <td>1562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>2011-01-05</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.226957</td>\n",
       "      <td>0.229270</td>\n",
       "      <td>0.436957</td>\n",
       "      <td>0.186900</td>\n",
       "      <td>82</td>\n",
       "      <td>1518</td>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   instant      dteday  season  yr  mnth  holiday  weekday  workingday  \\\n",
       "0        1  2011-01-01       1   0     1        0        6           0   \n",
       "1        2  2011-01-02       1   0     1        0        0           0   \n",
       "2        3  2011-01-03       1   0     1        0        1           1   \n",
       "3        4  2011-01-04       1   0     1        0        2           1   \n",
       "4        5  2011-01-05       1   0     1        0        3           1   \n",
       "\n",
       "   weathersit      temp     atemp       hum  windspeed  casual  registered  \\\n",
       "0           2  0.344167  0.363625  0.805833   0.160446     331         654   \n",
       "1           2  0.363478  0.353739  0.696087   0.248539     131         670   \n",
       "2           1  0.196364  0.189405  0.437273   0.248309     120        1229   \n",
       "3           1  0.200000  0.212122  0.590435   0.160296     108        1454   \n",
       "4           1  0.226957  0.229270  0.436957   0.186900      82        1518   \n",
       "\n",
       "    cnt  \n",
       "0   985  \n",
       "1   801  \n",
       "2  1349  \n",
       "3  1562  \n",
       "4  1600  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读入数据\n",
    "train = pd.read_csv(\"day.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 731 entries, 0 to 730\n",
      "Data columns (total 16 columns):\n",
      " #   Column      Non-Null Count  Dtype  \n",
      "---  ------      --------------  -----  \n",
      " 0   instant     731 non-null    int64  \n",
      " 1   dteday      731 non-null    object \n",
      " 2   season      731 non-null    int64  \n",
      " 3   yr          731 non-null    int64  \n",
      " 4   mnth        731 non-null    int64  \n",
      " 5   holiday     731 non-null    int64  \n",
      " 6   weekday     731 non-null    int64  \n",
      " 7   workingday  731 non-null    int64  \n",
      " 8   weathersit  731 non-null    int64  \n",
      " 9   temp        731 non-null    float64\n",
      " 10  atemp       731 non-null    float64\n",
      " 11  hum         731 non-null    float64\n",
      " 12  windspeed   731 non-null    float64\n",
      " 13  casual      731 non-null    int64  \n",
      " 14  registered  731 non-null    int64  \n",
      " 15  cnt         731 non-null    int64  \n",
      "dtypes: float64(4), int64(11), object(1)\n",
      "memory usage: 91.5+ KB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>season</th>\n",
       "      <th>yr</th>\n",
       "      <th>mnth</th>\n",
       "      <th>holiday</th>\n",
       "      <th>weekday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>weathersit</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>casual</th>\n",
       "      <th>registered</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>366.000000</td>\n",
       "      <td>2.496580</td>\n",
       "      <td>0.500684</td>\n",
       "      <td>6.519836</td>\n",
       "      <td>0.028728</td>\n",
       "      <td>2.997264</td>\n",
       "      <td>0.683995</td>\n",
       "      <td>1.395349</td>\n",
       "      <td>0.495385</td>\n",
       "      <td>0.474354</td>\n",
       "      <td>0.627894</td>\n",
       "      <td>0.190486</td>\n",
       "      <td>848.176471</td>\n",
       "      <td>3656.172367</td>\n",
       "      <td>4504.348837</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>211.165812</td>\n",
       "      <td>1.110807</td>\n",
       "      <td>0.500342</td>\n",
       "      <td>3.451913</td>\n",
       "      <td>0.167155</td>\n",
       "      <td>2.004787</td>\n",
       "      <td>0.465233</td>\n",
       "      <td>0.544894</td>\n",
       "      <td>0.183051</td>\n",
       "      <td>0.162961</td>\n",
       "      <td>0.142429</td>\n",
       "      <td>0.077498</td>\n",
       "      <td>686.622488</td>\n",
       "      <td>1560.256377</td>\n",
       "      <td>1937.211452</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.059130</td>\n",
       "      <td>0.079070</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.022392</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>20.000000</td>\n",
       "      <td>22.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>183.500000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.337083</td>\n",
       "      <td>0.337842</td>\n",
       "      <td>0.520000</td>\n",
       "      <td>0.134950</td>\n",
       "      <td>315.500000</td>\n",
       "      <td>2497.000000</td>\n",
       "      <td>3152.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>366.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.498333</td>\n",
       "      <td>0.486733</td>\n",
       "      <td>0.626667</td>\n",
       "      <td>0.180975</td>\n",
       "      <td>713.000000</td>\n",
       "      <td>3662.000000</td>\n",
       "      <td>4548.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>548.500000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>10.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>0.655417</td>\n",
       "      <td>0.608602</td>\n",
       "      <td>0.730209</td>\n",
       "      <td>0.233214</td>\n",
       "      <td>1096.000000</td>\n",
       "      <td>4776.500000</td>\n",
       "      <td>5956.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>731.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>12.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>0.861667</td>\n",
       "      <td>0.840896</td>\n",
       "      <td>0.972500</td>\n",
       "      <td>0.507463</td>\n",
       "      <td>3410.000000</td>\n",
       "      <td>6946.000000</td>\n",
       "      <td>8714.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          instant      season          yr        mnth     holiday     weekday  \\\n",
       "count  731.000000  731.000000  731.000000  731.000000  731.000000  731.000000   \n",
       "mean   366.000000    2.496580    0.500684    6.519836    0.028728    2.997264   \n",
       "std    211.165812    1.110807    0.500342    3.451913    0.167155    2.004787   \n",
       "min      1.000000    1.000000    0.000000    1.000000    0.000000    0.000000   \n",
       "25%    183.500000    2.000000    0.000000    4.000000    0.000000    1.000000   \n",
       "50%    366.000000    3.000000    1.000000    7.000000    0.000000    3.000000   \n",
       "75%    548.500000    3.000000    1.000000   10.000000    0.000000    5.000000   \n",
       "max    731.000000    4.000000    1.000000   12.000000    1.000000    6.000000   \n",
       "\n",
       "       workingday  weathersit        temp       atemp         hum   windspeed  \\\n",
       "count  731.000000  731.000000  731.000000  731.000000  731.000000  731.000000   \n",
       "mean     0.683995    1.395349    0.495385    0.474354    0.627894    0.190486   \n",
       "std      0.465233    0.544894    0.183051    0.162961    0.142429    0.077498   \n",
       "min      0.000000    1.000000    0.059130    0.079070    0.000000    0.022392   \n",
       "25%      0.000000    1.000000    0.337083    0.337842    0.520000    0.134950   \n",
       "50%      1.000000    1.000000    0.498333    0.486733    0.626667    0.180975   \n",
       "75%      1.000000    2.000000    0.655417    0.608602    0.730209    0.233214   \n",
       "max      1.000000    3.000000    0.861667    0.840896    0.972500    0.507463   \n",
       "\n",
       "            casual   registered          cnt  \n",
       "count   731.000000   731.000000   731.000000  \n",
       "mean    848.176471  3656.172367  4504.348837  \n",
       "std     686.622488  1560.256377  1937.211452  \n",
       "min       2.000000    20.000000    22.000000  \n",
       "25%     315.500000  2497.000000  3152.000000  \n",
       "50%     713.000000  3662.000000  4548.000000  \n",
       "75%    1096.000000  4776.500000  5956.000000  \n",
       "max    3410.000000  6946.000000  8714.000000  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#对数据值型特征，用常用统计量观察其分布\n",
    "train.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据分离\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "y=train['cnt']\n",
    "X=train.drop('cnt',axis=1)\n",
    "\n",
    "log_y=np.log1p(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "E:\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:3: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  This is separate from the ipykernel package so we can avoid doing imports until\n"
     ]
    }
   ],
   "source": [
    "day=train['dteday']\n",
    "for i in range(len(day)):\n",
    "    day[i]=day[i][-2:]\n",
    "X['season'].astype('object')\n",
    "x_season=X['season']\n",
    "x_season=pd.get_dummies(x_season,prefix='season')\n",
    "\n",
    "X['mnth'].astype('object')\n",
    "x_mnth=X['mnth']\n",
    "x_mnth=pd.get_dummies(x_mnth,prefix='mnth')\n",
    "\n",
    "X['weekday'].astype('object')\n",
    "x_weekday=X['weekday']\n",
    "x_weekday=pd.get_dummies(x_weekday,prefix='weekday')\n",
    "\n",
    "X['weathersit'].astype('object')\n",
    "x_weathersit=X['weathersit']\n",
    "x_weathersit=pd.get_dummies(x_weathersit,prefix='weathersit')\n",
    "features=['season','mnth','weekday','weathersit','dteday']\n",
    "X=X.drop(features,axis=1)\n",
    "X['day']=day\n",
    "feat_name=X.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数值特征标准化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 分别初始化对特征和目标值的标准化器\n",
    "ss_X = StandardScaler()\n",
    "ss_y = StandardScaler()\n",
    "\n",
    "ss_log_y = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征以及目标值进行标准化处理\n",
    "# 对训练数据，先调用fit方法训练模型，得到模型参数；然后对训练数据和测试数据进行transform\n",
    "X = ss_X.fit_transform(X)\n",
    "\n",
    "#对y做标准化不是必须\n",
    "#对y标准化的好处是不同问题的w差异不太大，同时正则参数的范围也有限\n",
    "y = ss_y.fit_transform(y.values.reshape(-1, 1))\n",
    "log_y = ss_y.fit_transform(log_y.values.reshape(-1, 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "fe_day=pd.DataFrame(data=X,columns=feat_name,index=train.index)\n",
    "fe_data=pd.concat([fe_day,x_season,x_mnth,x_weekday,x_weathersit],axis=1,ignore_index=False)\n",
    "\n",
    "fe_data['cnt']=y\n",
    "fe_data['log_cnt']=log_y\n",
    "fe_data.to_csv('FE_bo.csv',index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>yr</th>\n",
       "      <th>holiday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>casual</th>\n",
       "      <th>registered</th>\n",
       "      <th>...</th>\n",
       "      <th>weekday_2</th>\n",
       "      <th>weekday_3</th>\n",
       "      <th>weekday_4</th>\n",
       "      <th>weekday_5</th>\n",
       "      <th>weekday_6</th>\n",
       "      <th>weathersit_1</th>\n",
       "      <th>weathersit_2</th>\n",
       "      <th>weathersit_3</th>\n",
       "      <th>cnt</th>\n",
       "      <th>log_cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-1.729683</td>\n",
       "      <td>-1.001369</td>\n",
       "      <td>-0.171981</td>\n",
       "      <td>-1.471225</td>\n",
       "      <td>-0.826662</td>\n",
       "      <td>-0.679946</td>\n",
       "      <td>1.250171</td>\n",
       "      <td>-0.387892</td>\n",
       "      <td>-0.753734</td>\n",
       "      <td>-1.925471</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.817953</td>\n",
       "      <td>-2.387564</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.724944</td>\n",
       "      <td>-1.001369</td>\n",
       "      <td>-0.171981</td>\n",
       "      <td>-1.471225</td>\n",
       "      <td>-0.721095</td>\n",
       "      <td>-0.740652</td>\n",
       "      <td>0.479113</td>\n",
       "      <td>0.749602</td>\n",
       "      <td>-1.045214</td>\n",
       "      <td>-1.915209</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.912999</td>\n",
       "      <td>-2.742332</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-1.720205</td>\n",
       "      <td>-1.001369</td>\n",
       "      <td>-0.171981</td>\n",
       "      <td>0.679706</td>\n",
       "      <td>-1.634657</td>\n",
       "      <td>-1.749767</td>\n",
       "      <td>-1.339274</td>\n",
       "      <td>0.746632</td>\n",
       "      <td>-1.061246</td>\n",
       "      <td>-1.556689</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.629925</td>\n",
       "      <td>-1.847887</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-1.715466</td>\n",
       "      <td>-1.001369</td>\n",
       "      <td>-0.171981</td>\n",
       "      <td>0.679706</td>\n",
       "      <td>-1.614780</td>\n",
       "      <td>-1.610270</td>\n",
       "      <td>-0.263182</td>\n",
       "      <td>-0.389829</td>\n",
       "      <td>-1.078734</td>\n",
       "      <td>-1.412383</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.519898</td>\n",
       "      <td>-1.596254</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.710728</td>\n",
       "      <td>-1.001369</td>\n",
       "      <td>-0.171981</td>\n",
       "      <td>0.679706</td>\n",
       "      <td>-1.467414</td>\n",
       "      <td>-1.504971</td>\n",
       "      <td>-1.341494</td>\n",
       "      <td>-0.046307</td>\n",
       "      <td>-1.116627</td>\n",
       "      <td>-1.371336</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.500269</td>\n",
       "      <td>-1.554995</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 39 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    instant        yr   holiday  workingday      temp     atemp       hum  \\\n",
       "0 -1.729683 -1.001369 -0.171981   -1.471225 -0.826662 -0.679946  1.250171   \n",
       "1 -1.724944 -1.001369 -0.171981   -1.471225 -0.721095 -0.740652  0.479113   \n",
       "2 -1.720205 -1.001369 -0.171981    0.679706 -1.634657 -1.749767 -1.339274   \n",
       "3 -1.715466 -1.001369 -0.171981    0.679706 -1.614780 -1.610270 -0.263182   \n",
       "4 -1.710728 -1.001369 -0.171981    0.679706 -1.467414 -1.504971 -1.341494   \n",
       "\n",
       "   windspeed    casual  registered  ...  weekday_2  weekday_3  weekday_4  \\\n",
       "0  -0.387892 -0.753734   -1.925471  ...          0          0          0   \n",
       "1   0.749602 -1.045214   -1.915209  ...          0          0          0   \n",
       "2   0.746632 -1.061246   -1.556689  ...          0          0          0   \n",
       "3  -0.389829 -1.078734   -1.412383  ...          1          0          0   \n",
       "4  -0.046307 -1.116627   -1.371336  ...          0          1          0   \n",
       "\n",
       "   weekday_5  weekday_6  weathersit_1  weathersit_2  weathersit_3       cnt  \\\n",
       "0          0          1             0             1             0 -1.817953   \n",
       "1          0          0             0             1             0 -1.912999   \n",
       "2          0          0             1             0             0 -1.629925   \n",
       "3          0          0             1             0             0 -1.519898   \n",
       "4          0          0             1             0             0 -1.500269   \n",
       "\n",
       "    log_cnt  \n",
       "0 -2.387564  \n",
       "1 -2.742332  \n",
       "2 -1.847887  \n",
       "3 -1.596254  \n",
       "4 -1.554995  \n",
       "\n",
       "[5 rows x 39 columns]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fe_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 731 entries, 0 to 730\n",
      "Data columns (total 39 columns):\n",
      " #   Column        Non-Null Count  Dtype  \n",
      "---  ------        --------------  -----  \n",
      " 0   instant       731 non-null    float64\n",
      " 1   yr            731 non-null    float64\n",
      " 2   holiday       731 non-null    float64\n",
      " 3   workingday    731 non-null    float64\n",
      " 4   temp          731 non-null    float64\n",
      " 5   atemp         731 non-null    float64\n",
      " 6   hum           731 non-null    float64\n",
      " 7   windspeed     731 non-null    float64\n",
      " 8   casual        731 non-null    float64\n",
      " 9   registered    731 non-null    float64\n",
      " 10  day           731 non-null    float64\n",
      " 11  season_1      731 non-null    uint8  \n",
      " 12  season_2      731 non-null    uint8  \n",
      " 13  season_3      731 non-null    uint8  \n",
      " 14  season_4      731 non-null    uint8  \n",
      " 15  mnth_1        731 non-null    uint8  \n",
      " 16  mnth_2        731 non-null    uint8  \n",
      " 17  mnth_3        731 non-null    uint8  \n",
      " 18  mnth_4        731 non-null    uint8  \n",
      " 19  mnth_5        731 non-null    uint8  \n",
      " 20  mnth_6        731 non-null    uint8  \n",
      " 21  mnth_7        731 non-null    uint8  \n",
      " 22  mnth_8        731 non-null    uint8  \n",
      " 23  mnth_9        731 non-null    uint8  \n",
      " 24  mnth_10       731 non-null    uint8  \n",
      " 25  mnth_11       731 non-null    uint8  \n",
      " 26  mnth_12       731 non-null    uint8  \n",
      " 27  weekday_0     731 non-null    uint8  \n",
      " 28  weekday_1     731 non-null    uint8  \n",
      " 29  weekday_2     731 non-null    uint8  \n",
      " 30  weekday_3     731 non-null    uint8  \n",
      " 31  weekday_4     731 non-null    uint8  \n",
      " 32  weekday_5     731 non-null    uint8  \n",
      " 33  weekday_6     731 non-null    uint8  \n",
      " 34  weathersit_1  731 non-null    uint8  \n",
      " 35  weathersit_2  731 non-null    uint8  \n",
      " 36  weathersit_3  731 non-null    uint8  \n",
      " 37  cnt           731 non-null    float64\n",
      " 38  log_cnt       731 non-null    float64\n",
      "dtypes: float64(13), uint8(26)\n",
      "memory usage: 92.9 KB\n"
     ]
    }
   ],
   "source": [
    "fe_data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 731 entries, 0 to 730\n",
      "Data columns (total 39 columns):\n",
      " #   Column        Non-Null Count  Dtype  \n",
      "---  ------        --------------  -----  \n",
      " 0   instant       731 non-null    float64\n",
      " 1   yr            731 non-null    float64\n",
      " 2   holiday       731 non-null    float64\n",
      " 3   workingday    731 non-null    float64\n",
      " 4   temp          731 non-null    float64\n",
      " 5   atemp         731 non-null    float64\n",
      " 6   hum           731 non-null    float64\n",
      " 7   windspeed     731 non-null    float64\n",
      " 8   casual        731 non-null    float64\n",
      " 9   registered    731 non-null    float64\n",
      " 10  day           731 non-null    float64\n",
      " 11  season_1      731 non-null    int64  \n",
      " 12  season_2      731 non-null    int64  \n",
      " 13  season_3      731 non-null    int64  \n",
      " 14  season_4      731 non-null    int64  \n",
      " 15  mnth_1        731 non-null    int64  \n",
      " 16  mnth_2        731 non-null    int64  \n",
      " 17  mnth_3        731 non-null    int64  \n",
      " 18  mnth_4        731 non-null    int64  \n",
      " 19  mnth_5        731 non-null    int64  \n",
      " 20  mnth_6        731 non-null    int64  \n",
      " 21  mnth_7        731 non-null    int64  \n",
      " 22  mnth_8        731 non-null    int64  \n",
      " 23  mnth_9        731 non-null    int64  \n",
      " 24  mnth_10       731 non-null    int64  \n",
      " 25  mnth_11       731 non-null    int64  \n",
      " 26  mnth_12       731 non-null    int64  \n",
      " 27  weekday_0     731 non-null    int64  \n",
      " 28  weekday_1     731 non-null    int64  \n",
      " 29  weekday_2     731 non-null    int64  \n",
      " 30  weekday_3     731 non-null    int64  \n",
      " 31  weekday_4     731 non-null    int64  \n",
      " 32  weekday_5     731 non-null    int64  \n",
      " 33  weekday_6     731 non-null    int64  \n",
      " 34  weathersit_1  731 non-null    int64  \n",
      " 35  weathersit_2  731 non-null    int64  \n",
      " 36  weathersit_3  731 non-null    int64  \n",
      " 37  cnt           731 non-null    float64\n",
      " 38  log_cnt       731 non-null    float64\n",
      "dtypes: float64(13), int64(26)\n",
      "memory usage: 222.9 KB\n"
     ]
    }
   ],
   "source": [
    "df=pd.read_csv('FE_bo.csv')\n",
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>yr</th>\n",
       "      <th>holiday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>casual</th>\n",
       "      <th>registered</th>\n",
       "      <th>...</th>\n",
       "      <th>weekday_2</th>\n",
       "      <th>weekday_3</th>\n",
       "      <th>weekday_4</th>\n",
       "      <th>weekday_5</th>\n",
       "      <th>weekday_6</th>\n",
       "      <th>weathersit_1</th>\n",
       "      <th>weathersit_2</th>\n",
       "      <th>weathersit_3</th>\n",
       "      <th>cnt</th>\n",
       "      <th>log_cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-1.729683</td>\n",
       "      <td>-1.001369</td>\n",
       "      <td>-0.171981</td>\n",
       "      <td>-1.471225</td>\n",
       "      <td>-0.826662</td>\n",
       "      <td>-0.679946</td>\n",
       "      <td>1.250171</td>\n",
       "      <td>-0.387892</td>\n",
       "      <td>-0.753734</td>\n",
       "      <td>-1.925471</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.817953</td>\n",
       "      <td>-2.387564</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.724944</td>\n",
       "      <td>-1.001369</td>\n",
       "      <td>-0.171981</td>\n",
       "      <td>-1.471225</td>\n",
       "      <td>-0.721095</td>\n",
       "      <td>-0.740652</td>\n",
       "      <td>0.479113</td>\n",
       "      <td>0.749602</td>\n",
       "      <td>-1.045214</td>\n",
       "      <td>-1.915209</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.912999</td>\n",
       "      <td>-2.742332</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-1.720205</td>\n",
       "      <td>-1.001369</td>\n",
       "      <td>-0.171981</td>\n",
       "      <td>0.679706</td>\n",
       "      <td>-1.634657</td>\n",
       "      <td>-1.749767</td>\n",
       "      <td>-1.339274</td>\n",
       "      <td>0.746632</td>\n",
       "      <td>-1.061246</td>\n",
       "      <td>-1.556689</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.629925</td>\n",
       "      <td>-1.847887</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-1.715466</td>\n",
       "      <td>-1.001369</td>\n",
       "      <td>-0.171981</td>\n",
       "      <td>0.679706</td>\n",
       "      <td>-1.614780</td>\n",
       "      <td>-1.610270</td>\n",
       "      <td>-0.263182</td>\n",
       "      <td>-0.389829</td>\n",
       "      <td>-1.078734</td>\n",
       "      <td>-1.412383</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.519898</td>\n",
       "      <td>-1.596254</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.710728</td>\n",
       "      <td>-1.001369</td>\n",
       "      <td>-0.171981</td>\n",
       "      <td>0.679706</td>\n",
       "      <td>-1.467414</td>\n",
       "      <td>-1.504971</td>\n",
       "      <td>-1.341494</td>\n",
       "      <td>-0.046307</td>\n",
       "      <td>-1.116627</td>\n",
       "      <td>-1.371336</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.500269</td>\n",
       "      <td>-1.554995</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 39 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    instant        yr   holiday  workingday      temp     atemp       hum  \\\n",
       "0 -1.729683 -1.001369 -0.171981   -1.471225 -0.826662 -0.679946  1.250171   \n",
       "1 -1.724944 -1.001369 -0.171981   -1.471225 -0.721095 -0.740652  0.479113   \n",
       "2 -1.720205 -1.001369 -0.171981    0.679706 -1.634657 -1.749767 -1.339274   \n",
       "3 -1.715466 -1.001369 -0.171981    0.679706 -1.614780 -1.610270 -0.263182   \n",
       "4 -1.710728 -1.001369 -0.171981    0.679706 -1.467414 -1.504971 -1.341494   \n",
       "\n",
       "   windspeed    casual  registered  ...  weekday_2  weekday_3  weekday_4  \\\n",
       "0  -0.387892 -0.753734   -1.925471  ...          0          0          0   \n",
       "1   0.749602 -1.045214   -1.915209  ...          0          0          0   \n",
       "2   0.746632 -1.061246   -1.556689  ...          0          0          0   \n",
       "3  -0.389829 -1.078734   -1.412383  ...          1          0          0   \n",
       "4  -0.046307 -1.116627   -1.371336  ...          0          1          0   \n",
       "\n",
       "   weekday_5  weekday_6  weathersit_1  weathersit_2  weathersit_3       cnt  \\\n",
       "0          0          1             0             1             0 -1.817953   \n",
       "1          0          0             0             1             0 -1.912999   \n",
       "2          0          0             1             0             0 -1.629925   \n",
       "3          0          0             1             0             0 -1.519898   \n",
       "4          0          0             1             0             0 -1.500269   \n",
       "\n",
       "    log_cnt  \n",
       "0 -2.387564  \n",
       "1 -2.742332  \n",
       "2 -1.847887  \n",
       "3 -1.596254  \n",
       "4 -1.554995  \n",
       "\n",
       "[5 rows x 39 columns]"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "features=['instant','casual','registered']\n",
    "df=df.drop(features,axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "X=df.drop('cnt',axis=1)\n",
    "y=df['cnt']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(584, 35)"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#将数据分割训练数据与测试数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# 随机采样20%的数据构建测试样本，其余作为训练样本\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.2)\n",
    "X_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression,Lasso,Ridge\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from math import sqrt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [],
   "source": [
    "lr=LinearRegression()\n",
    "rr=Ridge()   \n",
    "lsr=Lasso()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Lasso(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=1000,\n",
       "      normalize=False, positive=False, precompute=False, random_state=None,\n",
       "      selection='cyclic', tol=0.0001, warm_start=False)"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr.fit(X_train,y_train)\n",
    "rr.fit(X_train,y_train)\n",
    "lsr.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_pred_lr = lr.predict(X_test)\n",
    "y_test_pred_rr = rr.predict(X_test)\n",
    "y_test_pred_lsr = lsr.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LinearRegression MSE: 0.287\n",
      "Ridge MSE: 0.286\n",
      "Lasso MSE: 1.015\n"
     ]
    }
   ],
   "source": [
    "RMSE_lr_test = sqrt(mean_squared_error(y_test,y_test_pred_lr))\n",
    "RMSE_rr_test = sqrt(mean_squared_error(y_test,y_test_pred_rr))\n",
    "RMSE_lsr_test = sqrt(mean_squared_error(y_test,y_test_pred_lsr))\n",
    "print('LinearRegression MSE: {:.3f}\\nRidge MSE: {:.3f}\\nLasso MSE: {:.3f}'.format(RMSE_lr_test,RMSE_rr_test,RMSE_lsr_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "测试集上 LinearRegression 和 Ridge 的RMSE 比较小"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train_pred_lr = lr.predict(X_train)\n",
    "y_train_pred_rr = rr.predict(X_train)\n",
    "y_train_pred_lsr = lsr.predict(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LinearRegression RMSE: 0.273\n",
      "Ridge RMSE: 0.273\n",
      "Lasso RMSE: 0.996\n"
     ]
    }
   ],
   "source": [
    "RMSE_lr_train = sqrt(mean_squared_error(y_train,y_train_pred_lr))\n",
    "RMSE_rr_train = sqrt(mean_squared_error(y_train,y_train_pred_rr))\n",
    "RMSE_lsr_train = sqrt(mean_squared_error(y_train,y_train_pred_lsr))\n",
    "print('LinearRegression RMSE: {:.3f}\\nRidge RMSE: {:.3f}\\nLasso RMSE: {:.3f}'.format(RMSE_lr_train,RMSE_rr_train,RMSE_lsr_train))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "训练集上 LinearRegression 和 Ridge 的RMSE 比较小"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>columns</th>\n",
       "      <th>coef_lr</th>\n",
       "      <th>coef_ridge</th>\n",
       "      <th>coef_lasso</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>log_cnt</td>\n",
       "      <td>0.565823</td>\n",
       "      <td>0.563985</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>mnth_9</td>\n",
       "      <td>0.300489</td>\n",
       "      <td>0.277087</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>yr</td>\n",
       "      <td>0.297025</td>\n",
       "      <td>0.296710</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>mnth_8</td>\n",
       "      <td>0.180238</td>\n",
       "      <td>0.147211</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>mnth_10</td>\n",
       "      <td>0.167132</td>\n",
       "      <td>0.174658</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>season_4</td>\n",
       "      <td>0.158168</td>\n",
       "      <td>0.148519</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>mnth_6</td>\n",
       "      <td>0.132023</td>\n",
       "      <td>0.111030</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>atemp</td>\n",
       "      <td>0.081373</td>\n",
       "      <td>0.077410</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>weekday_6</td>\n",
       "      <td>0.077159</td>\n",
       "      <td>0.075847</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>temp</td>\n",
       "      <td>0.074529</td>\n",
       "      <td>0.089358</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>season_2</td>\n",
       "      <td>0.057788</td>\n",
       "      <td>0.060613</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>weathersit_1</td>\n",
       "      <td>0.056358</td>\n",
       "      <td>0.056855</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>mnth_5</td>\n",
       "      <td>0.049874</td>\n",
       "      <td>0.041819</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>weathersit_3</td>\n",
       "      <td>0.032448</td>\n",
       "      <td>0.030277</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>weekday_3</td>\n",
       "      <td>0.027478</td>\n",
       "      <td>0.026805</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>weekday_5</td>\n",
       "      <td>0.024169</td>\n",
       "      <td>0.024174</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>workingday</td>\n",
       "      <td>0.018069</td>\n",
       "      <td>0.017695</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>mnth_7</td>\n",
       "      <td>0.016566</td>\n",
       "      <td>-0.015983</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>weekday_4</td>\n",
       "      <td>0.007042</td>\n",
       "      <td>0.005448</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>day</td>\n",
       "      <td>0.003246</td>\n",
       "      <td>0.002646</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>holiday</td>\n",
       "      <td>-0.000874</td>\n",
       "      <td>-0.001626</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>weekday_2</td>\n",
       "      <td>-0.022954</td>\n",
       "      <td>-0.022407</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>weekday_1</td>\n",
       "      <td>-0.027480</td>\n",
       "      <td>-0.026065</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>windspeed</td>\n",
       "      <td>-0.035840</td>\n",
       "      <td>-0.036470</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>mnth_3</td>\n",
       "      <td>-0.046958</td>\n",
       "      <td>-0.034245</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>hum</td>\n",
       "      <td>-0.049197</td>\n",
       "      <td>-0.050148</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>mnth_4</td>\n",
       "      <td>-0.076200</td>\n",
       "      <td>-0.075401</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>season_3</td>\n",
       "      <td>-0.084031</td>\n",
       "      <td>-0.065755</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>weekday_0</td>\n",
       "      <td>-0.085414</td>\n",
       "      <td>-0.083803</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>weathersit_2</td>\n",
       "      <td>-0.088806</td>\n",
       "      <td>-0.087132</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>mnth_1</td>\n",
       "      <td>-0.122355</td>\n",
       "      <td>-0.096172</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>season_1</td>\n",
       "      <td>-0.131925</td>\n",
       "      <td>-0.143378</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>mnth_2</td>\n",
       "      <td>-0.188693</td>\n",
       "      <td>-0.163586</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>mnth_12</td>\n",
       "      <td>-0.193982</td>\n",
       "      <td>-0.170330</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>mnth_11</td>\n",
       "      <td>-0.218133</td>\n",
       "      <td>-0.196087</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         columns   coef_lr  coef_ridge  coef_lasso\n",
       "34       log_cnt  0.565823    0.563985         0.0\n",
       "20        mnth_9  0.300489    0.277087         0.0\n",
       "0             yr  0.297025    0.296710         0.0\n",
       "19        mnth_8  0.180238    0.147211         0.0\n",
       "21       mnth_10  0.167132    0.174658         0.0\n",
       "11      season_4  0.158168    0.148519         0.0\n",
       "17        mnth_6  0.132023    0.111030         0.0\n",
       "4          atemp  0.081373    0.077410         0.0\n",
       "30     weekday_6  0.077159    0.075847        -0.0\n",
       "3           temp  0.074529    0.089358         0.0\n",
       "9       season_2  0.057788    0.060613         0.0\n",
       "31  weathersit_1  0.056358    0.056855         0.0\n",
       "16        mnth_5  0.049874    0.041819         0.0\n",
       "33  weathersit_3  0.032448    0.030277        -0.0\n",
       "27     weekday_3  0.027478    0.026805         0.0\n",
       "29     weekday_5  0.024169    0.024174         0.0\n",
       "2     workingday  0.018069    0.017695         0.0\n",
       "18        mnth_7  0.016566   -0.015983         0.0\n",
       "28     weekday_4  0.007042    0.005448         0.0\n",
       "7            day  0.003246    0.002646        -0.0\n",
       "1        holiday -0.000874   -0.001626        -0.0\n",
       "26     weekday_2 -0.022954   -0.022407         0.0\n",
       "25     weekday_1 -0.027480   -0.026065        -0.0\n",
       "6      windspeed -0.035840   -0.036470        -0.0\n",
       "14        mnth_3 -0.046958   -0.034245        -0.0\n",
       "5            hum -0.049197   -0.050148        -0.0\n",
       "15        mnth_4 -0.076200   -0.075401        -0.0\n",
       "10      season_3 -0.084031   -0.065755         0.0\n",
       "24     weekday_0 -0.085414   -0.083803        -0.0\n",
       "32  weathersit_2 -0.088806   -0.087132        -0.0\n",
       "12        mnth_1 -0.122355   -0.096172        -0.0\n",
       "8       season_1 -0.131925   -0.143378        -0.0\n",
       "13        mnth_2 -0.188693   -0.163586        -0.0\n",
       "23       mnth_12 -0.193982   -0.170330        -0.0\n",
       "22       mnth_11 -0.218133   -0.196087        -0.0"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "feat_names = X.columns\n",
    "fs = pd.DataFrame({\"columns\":list(feat_names), \"coef_lr\":list((lr.coef_.T)), \"coef_ridge\":list((rr.coef_.T)), \"coef_lasso\":list((lsr.coef_.T))})\n",
    "fs.sort_values(by=['coef_lr'],ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The RMSE score of RidgeCV on test is 0.290128923308541\n",
      "The RMSE score of RidgeCV on train is 0.30047830977519635\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 2160x720 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "alpha is: 100.0\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import  RidgeCV\n",
    "#1. 设置超参数（正则参数）范围\n",
    "alphas = [ 0.01, 0.1, 1, 10,100]\n",
    "#n_alphas = 20\n",
    "#alphas = np.logspace(-5,2,n_alphas)\n",
    "\n",
    "#2. 生成一个RidgeCV实例\n",
    "ridge = RidgeCV(alphas=alphas, store_cv_values=True)  \n",
    "\n",
    "#3. 模型训练\n",
    "ridge.fit(X_train, y_train)    \n",
    "\n",
    "#4. 预测\n",
    "y_test_pred_ridge = ridge.predict(X_test)\n",
    "y_train_pred_ridge = ridge.predict(X_train)\n",
    "\n",
    "\n",
    "# 评估，使用RMSE_score评价模型在测试集和训练集上的性能\n",
    "print ('The RMSE score of RidgeCV on test is', sqrt(mean_squared_error(y_test, y_test_pred_ridge)))\n",
    "print ('The RMSE score of RidgeCV on train is',sqrt(mean_squared_error(y_train, y_train_pred_ridge)))\n",
    "\n",
    "mse_mean = np.mean(ridge.cv_values_, axis = 0)\n",
    "plt.plot(np.log10(alphas), mse_mean.reshape(len(alphas),1)) \n",
    "\n",
    "#这是为了标出最佳参数的位置，不是必须\n",
    "#plt.plot(np.log10(ridge.alpha_)*np.ones(3), [0.28, 0.29, 0.30])\n",
    "\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()\n",
    "\n",
    "print ('alpha is:', ridge.alpha_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The RMSE score of LassoCV on test is 0.28221035002292255\n",
      "The RMSE score of LassoCV on train is 0.2746899697253135\n"
     ]
    },
    {
     "data": {
      "image/png": "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AN3M4rVbsmlbU5LkrIlKue5AKQcAAAAAANDNzP3d+iTJ+OH9c8zh/QpOw75QygEAAAAAAHQzDy3bUcqdPcktue5CKQcAAAAAANCNbNjamKfXbEmilOtOlHIAAAAAAADdyMPLNyRJ+tVWZ/q4IQWnYV8p5QAAAAAAALqRuW+NrvyjCcPSu1d1wWnYV0o5AAAAAACAbqKltW3nTTmjK7sXpRwAAAAAAEA3sWj1G3mzoSVJctak4QWnYX8o5QAAAAAAALqJ9tGVk44YmKMG9y04DftDKQcAAAAAANBNzP3djtGVZ012S667UcoBAAAAAAB0A69tachzr76ZxPvkuqNeRQfYm/vvvz+33357li5dmra2towaNSqzZ8/Ol770pfTp02e/91u3bl3+5V/+JfPmzcurr76aXr165dhjj825556bOXPmpHfv3gfhUwAAAAAAABy4ect3jK4c2LtXTh0zpOA07K8uW8p997vfzS233JIkqampSU1NTVasWJHvfe97eeCBB3Lrrbdm8ODB+7zf0qVLc8kll2Tz5s1Jkr59+6axsTFLlizJkiVL8vOf/zw//OEPM2SIP2IAAAAAAKDraR9d+YGJw1JTbRhid9Ml/4/dc889ueWWW1JdXZ0rr7wyTz31VBYuXJibb745w4cPz/Lly/P1r399n/dramrKn//5n2fz5s2ZOHFi7rjjjixcuDCLFi3K3/3d36Vv375ZunRp/vZv//YgfioAAAAAAICOaWppy/znNyZJzjK6slvqcqVca2trrrvuuiTJZZddljlz5qS2tjZJMnPmzFx//fUplUqZO3dunnrqqX3a8+GHH87q1atTVVWVG264ISeffHJKpVJqa2vzqU99KldccUWS5Be/+EU2bdp0cD4YAAAAAABABy1YtSl1jS1JkrMmDi84DR3R5Uq5Rx99NKtWrUpVVVUuvvjitz2fMmVKZs6cmSS5++6792nPF198MUkybNiwHH300W97ftpppyVJ2trasn79+o5GBwAAAAAAOCjmLdsxuvKEowZlxKA+BaehI7pcKff4448nSSZPnpyhQ4e+45oZM2YkSebPn79Pew4cODBJsmHDhqxdu/ZtzxcvXpwk6dWrV4466qj9zgwAAAAAAHAwzV2241LR2UZXdltdrpR7/vnnkyTjx4/f45qxY8cmSdauXZv6+vp33XPmzJmprq5O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e3a+9KUvpU+fPh3ac968efnpT3+aJUuWZMuWLRkyZEhOO+20XHbZZZk8eXInfwIAAAAAAKC7+MljL6WlrZxhA2pz3slHFR2HHqbL3pT77ne/m6997WtZsGBBmpqaUiqVsmLFinzve9/L+eefnzfeeGO/9iuXy/nmN7+Zyy+/PHPnzs2mTZtSU1OT9evX5957781nPvOZPPDAAwfp0wAAAAAAAF3Z9qbW/OsTLydJ5rxvTPrUVBeciJ6mS5Zy99xzT2655ZZUV1fnyiuvzFNPPZWFCxfm5ptvzvDhw7N8+fJ8/etf3689r7/++vz7v6PbLkYAACAASURBVP97qqur8z/+x//IwoULs3Dhwtxzzz2ZOnVqmpub8zd/8zdZt27dQfpUAAAAAABAV/Wzp9bkjfrm1FZX5aLTxxQdhx6oy5Vyra2tue6665Ikl112WebMmZPa2tokycyZM3P99denVCpl7ty5eeqpp/Zpz9deey033HBDkuR//+//vdv4y0mTJuXGG2/MoEGDUl9fn3vuuecgfCoAAAAAAKCramsr54e/Xpkk+cQpR2X4wN4FJ6In6nLvlHv00UezatWqVFVV5eKLL37b8ylTpmTmzJl55JFHcvfdd2fq1Knvuuc999yTxsbGvPe9782nP/3ptz0fNGhQvv3tb2fTpk054YQTOuVzAAAAAAAA3cO8FRvywoZtSZJLPzCu4DT0VF2ulHv88ceTJJMnT87QoUPfcc2MGTPyyCOPZP78+fu0569+9askySc+8Yk9rjn33HP3MykAAAAAANAT3DJ/xy25P5pweCaPHFRwGnqqLlfKPf/880mS8ePH73HN2LFjkyRr165NfX19+vXrt8e15XI5y5cvT5K85z3vybZt23L77bfnv/7rv7J+/foMHjw4Z599di655JIMGDCg8z4IAAAAAADQ5S17bWseWbExSXLpTLfkOHi6XCm3fv36JMkRRxyxxzUjRozY+fWGDRsyZsyeX7j46quvpr6+PklSX1+f8847L2vWrNn5fO3atXn22Wdz11135ZZbbtlZ+AEAAAAAAD1f+y258cP756yJI95lNXRclyvltm3bMbO1b9++e1yz67O6urq97vfmm2/u/Pqv//qvU1dXlyuvvDIf+9jHUltbm3nz5uWqq67K2rVr86d/+qe566679vq7301ra2uWLVvW4Z+n49rL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\n",
      "text/plain": [
       "<Figure size 2160x720 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "alpha is: 0.001390264668686909\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LassoCV\n",
    "\n",
    "#1. 设置超参数搜索范围\n",
    "alphas = [ 0.01, 0.1, 1, 10,100]\n",
    "\n",
    "#2. 生成学习器实例\n",
    "lasso = LassoCV(alphas=alphas)\n",
    "\n",
    "#1. 设置超参数搜索范围\n",
    "#Lasso可以自动确定最大的alpha，所以另一种设置alpha的方式是设置最小的alpha值（eps） 和 超参数的数目（n_alphas），\n",
    "#然后LassoCV对最小值和最大值之间在log域上均匀取值n_alphas个\n",
    "# np.logspace(np.log10(alpha_max * eps), np.log10(alpha_max),num=n_alphas)[::-1]\n",
    "\n",
    "#2 生成LassoCV实例（默认超参数搜索范围）\n",
    "lasso = LassoCV()  \n",
    "\n",
    "#3. 训练（内含CV）\n",
    "lasso.fit(X_train, y_train)  \n",
    "\n",
    "#4. 测试\n",
    "y_test_pred_lasso = lasso.predict(X_test)\n",
    "y_train_pred_lasso = lasso.predict(X_train)\n",
    "\n",
    "\n",
    "# 评估，使用RMSE评价模型在测试集和训练集上的性能\n",
    "print ('The RMSE score of LassoCV on test is', sqrt(mean_squared_error(y_test, y_test_pred_lasso)))\n",
    "print ('The RMSE score of LassoCV on train is', sqrt(mean_squared_error(y_train, y_train_pred_lasso)))\n",
    "mses = np.mean(lasso.mse_path_, axis = 1)\n",
    "plt.plot(np.log10(lasso.alphas_), mses) \n",
    "#plt.plot(np.log10(lasso.alphas_)*np.ones(3), [0.3, 0.4, 1.0])\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()    \n",
    "            \n",
    "print ('alpha is:', lasso.alpha_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>columns</th>\n",
       "      <th>coef_lr</th>\n",
       "      <th>coef_ridge</th>\n",
       "      <th>coef_lasso</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>log_cnt</td>\n",
       "      <td>0.565823</td>\n",
       "      <td>0.474080</td>\n",
       "      <td>0.577671</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>mnth_9</td>\n",
       "      <td>0.300489</td>\n",
       "      <td>0.075278</td>\n",
       "      <td>0.243605</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>yr</td>\n",
       "      <td>0.297025</td>\n",
       "      <td>0.283933</td>\n",
       "      <td>0.289100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>mnth_8</td>\n",
       "      <td>0.180238</td>\n",
       "      <td>0.011505</td>\n",
       "      <td>0.080459</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>mnth_10</td>\n",
       "      <td>0.167132</td>\n",
       "      <td>0.080734</td>\n",
       "      <td>0.235823</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>season_4</td>\n",
       "      <td>0.158168</td>\n",
       "      <td>0.087085</td>\n",
       "      <td>0.072444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>mnth_6</td>\n",
       "      <td>0.132023</td>\n",
       "      <td>0.022778</td>\n",
       "      <td>0.067704</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>atemp</td>\n",
       "      <td>0.081373</td>\n",
       "      <td>0.125682</td>\n",
       "      <td>0.055061</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>weekday_6</td>\n",
       "      <td>0.077159</td>\n",
       "      <td>0.031361</td>\n",
       "      <td>0.028660</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>temp</td>\n",
       "      <td>0.074529</td>\n",
       "      <td>0.130323</td>\n",
       "      <td>0.131290</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>season_2</td>\n",
       "      <td>0.057788</td>\n",
       "      <td>0.039085</td>\n",
       "      <td>0.050799</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>weathersit_1</td>\n",
       "      <td>0.056358</td>\n",
       "      <td>0.063418</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>mnth_5</td>\n",
       "      <td>0.049874</td>\n",
       "      <td>0.017719</td>\n",
       "      <td>0.023177</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>weathersit_3</td>\n",
       "      <td>0.032448</td>\n",
       "      <td>-0.013586</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>weekday_3</td>\n",
       "      <td>0.027478</td>\n",
       "      <td>0.010834</td>\n",
       "      <td>0.015534</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>weekday_5</td>\n",
       "      <td>0.024169</td>\n",
       "      <td>0.012491</td>\n",
       "      <td>0.012847</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>workingday</td>\n",
       "      <td>0.018069</td>\n",
       "      <td>0.017701</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>mnth_7</td>\n",
       "      <td>0.016566</td>\n",
       "      <td>-0.052057</td>\n",
       "      <td>-0.055077</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>weekday_4</td>\n",
       "      <td>0.007042</td>\n",
       "      <td>0.000965</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>day</td>\n",
       "      <td>0.003246</td>\n",
       "      <td>-0.004671</td>\n",
       "      <td>0.000686</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>holiday</td>\n",
       "      <td>-0.000874</td>\n",
       "      <td>-0.010201</td>\n",
       "      <td>-0.008900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>weekday_2</td>\n",
       "      <td>-0.022954</td>\n",
       "      <td>-0.007264</td>\n",
       "      <td>-0.013450</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>weekday_1</td>\n",
       "      <td>-0.027480</td>\n",
       "      <td>-0.010501</td>\n",
       "      <td>-0.011866</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>windspeed</td>\n",
       "      <td>-0.035840</td>\n",
       "      <td>-0.048742</td>\n",
       "      <td>-0.034891</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>mnth_3</td>\n",
       "      <td>-0.046958</td>\n",
       "      <td>-0.003351</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>hum</td>\n",
       "      <td>-0.049197</td>\n",
       "      <td>-0.051650</td>\n",
       "      <td>-0.049772</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>mnth_4</td>\n",
       "      <td>-0.076200</td>\n",
       "      <td>-0.011707</td>\n",
       "      <td>-0.045984</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>season_3</td>\n",
       "      <td>-0.084031</td>\n",
       "      <td>-0.003568</td>\n",
       "      <td>-0.039163</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>weekday_0</td>\n",
       "      <td>-0.085414</td>\n",
       "      <td>-0.037887</td>\n",
       "      <td>-0.107947</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>weathersit_2</td>\n",
       "      <td>-0.088806</td>\n",
       "      <td>-0.049832</td>\n",
       "      <td>-0.132838</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>mnth_1</td>\n",
       "      <td>-0.122355</td>\n",
       "      <td>-0.034816</td>\n",
       "      <td>-0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>season_1</td>\n",
       "      <td>-0.131925</td>\n",
       "      <td>-0.122602</td>\n",
       "      <td>-0.184032</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>mnth_2</td>\n",
       "      <td>-0.188693</td>\n",
       "      <td>-0.053920</td>\n",
       "      <td>-0.073381</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>mnth_12</td>\n",
       "      <td>-0.193982</td>\n",
       "      <td>-0.030498</td>\n",
       "      <td>-0.063821</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>mnth_11</td>\n",
       "      <td>-0.218133</td>\n",
       "      <td>-0.021665</td>\n",
       "      <td>-0.089043</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         columns   coef_lr  coef_ridge  coef_lasso\n",
       "34       log_cnt  0.565823    0.474080    0.577671\n",
       "20        mnth_9  0.300489    0.075278    0.243605\n",
       "0             yr  0.297025    0.283933    0.289100\n",
       "19        mnth_8  0.180238    0.011505    0.080459\n",
       "21       mnth_10  0.167132    0.080734    0.235823\n",
       "11      season_4  0.158168    0.087085    0.072444\n",
       "17        mnth_6  0.132023    0.022778    0.067704\n",
       "4          atemp  0.081373    0.125682    0.055061\n",
       "30     weekday_6  0.077159    0.031361    0.028660\n",
       "3           temp  0.074529    0.130323    0.131290\n",
       "9       season_2  0.057788    0.039085    0.050799\n",
       "31  weathersit_1  0.056358    0.063418    0.000000\n",
       "16        mnth_5  0.049874    0.017719    0.023177\n",
       "33  weathersit_3  0.032448   -0.013586    0.000000\n",
       "27     weekday_3  0.027478    0.010834    0.015534\n",
       "29     weekday_5  0.024169    0.012491    0.012847\n",
       "2     workingday  0.018069    0.017701    0.000000\n",
       "18        mnth_7  0.016566   -0.052057   -0.055077\n",
       "28     weekday_4  0.007042    0.000965    0.000000\n",
       "7            day  0.003246   -0.004671    0.000686\n",
       "1        holiday -0.000874   -0.010201   -0.008900\n",
       "26     weekday_2 -0.022954   -0.007264   -0.013450\n",
       "25     weekday_1 -0.027480   -0.010501   -0.011866\n",
       "6      windspeed -0.035840   -0.048742   -0.034891\n",
       "14        mnth_3 -0.046958   -0.003351    0.000000\n",
       "5            hum -0.049197   -0.051650   -0.049772\n",
       "15        mnth_4 -0.076200   -0.011707   -0.045984\n",
       "10      season_3 -0.084031   -0.003568   -0.039163\n",
       "24     weekday_0 -0.085414   -0.037887   -0.107947\n",
       "32  weathersit_2 -0.088806   -0.049832   -0.132838\n",
       "12        mnth_1 -0.122355   -0.034816   -0.000000\n",
       "8       season_1 -0.131925   -0.122602   -0.184032\n",
       "13        mnth_2 -0.188693   -0.053920   -0.073381\n",
       "23       mnth_12 -0.193982   -0.030498   -0.063821\n",
       "22       mnth_11 -0.218133   -0.021665   -0.089043"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "feat_names = X.columns\n",
    "fs = pd.DataFrame({\"columns\":list(feat_names), \"coef_lr\":list((lr.coef_.T)), \"coef_ridge\":list((ridge.coef_.T)), \"coef_lasso\":list((lasso.coef_.T))})\n",
    "fs.sort_values(by=['coef_lr'],ascending=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "调优后 ：Lasso 的RMSE 微好于 Ridge。  Lasso 当正则参数取合适值时，使得有些线性回归系数为0，得到稀疏模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
